home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / oh!.2hd / OH!DEN_B.LZH / TOOLS / CDC / CDCSXSRC.LZH / LBSRC.LZH / SCROLL.HAS < prev    next >
Text File  |  1995-03-20  |  22KB  |  1,144 lines

  1. *スクロール処理関数
  2. .text
  3.         .include    DOSCALL.MAC    *標準の奴(XC)
  4.         .include    SXCALL.MAC    *FSX Ver2.01用(シャープコンパチ)
  5.         .include    SXCALL.H
  6. *        .include    YOU106.MAC    *独自のマクロ定義ファイルです
  7.         .include    YOU200.MAC    *独自のマクロ定義ファイルです
  8.         .include    HASMACRO.MAC    *HASのマクロパッケージ
  9.  
  10.         .include    WORK.INC    *ワークエリアの内容を定義するファイル
  11.         .include    FLAG.INC    *条件付アセンブル処理を定義するファイル
  12.  
  13. *T_Break        macro
  14. *        ~T
  15. *        rts
  16. *endm
  17.  
  18. ofs    =    -8
  19. SCREGS    reg    d1-d7/a1-a5
  20. .offset    ofs
  21. ds.l    2
  22. ds.l    2
  23. SCmode:        ds.w    1        *コマンド
  24. SCPtr:        ds.l    1        *構造体アドレス
  25. SCKey:
  26. SCargc:        ds.l    1        *要素数-1必ず
  27. SCslct:
  28. SCstrHdl:    ds.l    1        *文字列へのハンドル(描画時)
  29. SCnowx:        ds.l    1        *THUMB描画時ローカル座標
  30. SCpart:
  31. SCwinPtr:    ds.l    1        *ウィンドウ構造体アドレス(最初だけ)
  32. SCfont:        ds.w    1
  33. SCfontline:    ds.w    1
  34. SCscrline:    ds.w    1
  35. SCyy:        ds.w    1
  36. SCx1:        ds.w    1
  37. SCchr:        ds.w    1
  38. SCchr2:        ds.w    1
  39. SCyline:    ds.w    1
  40. SCKeyPtr:    ds.l    1
  41.  
  42. *INIT
  43. *pea.l    KeyPtr(a5)
  44. *move.w    yline,-(sp)
  45. *move.w    chr2,-(sp)
  46. *move.w    chr,-(sp)
  47. *move.w    x1,-(sp)
  48. *move.w    yy,-(sp)
  49. *move.w    scrline,-(sp)
  50. *move.w    fontline,-(sp)
  51. *move.w    font,-(sp)
  52. *move.l    winptr,-(sp)
  53. *pea    0.w    *LOCAL
  54. *pea    0.w    *STRHDL
  55. *move.l    argc,-(sp)
  56. *pea.l    STRCTptr(a5) **or pea    0.w
  57. *move.w    COMMAND,-(sp)    0=INIT 1=ALLDRAW 2=CTRLCHK
  58. *
  59. *lea    42(sp),sp
  60. *
  61. *ALLDRAW
  62. *
  63. *move.l    local,-(sp)
  64. *move.l    STRHDL(a5),-(sp)
  65. *move.l    argc,-(sp)
  66. *pea.l    STRCTptr(a5)
  67. *move.w    #1,-(sp)
  68. *jsr
  69. *lea.l    18(sp),sp
  70. *
  71. *CTRLCHK
  72. *
  73. *move.l    local,-(sp)
  74. *move.l    STRHDL(a5),-(sp)
  75. *move.l    argc,-(sp)
  76. *pea.l    STRCTptr(a5)
  77. *move.w    #1,-(sp)
  78. *jsr
  79. *lea.l    18(sp),sp
  80. *
  81. *END
  82. *pea.l    STRCTptr(a5)
  83. *move.w    #3,-(sp)
  84. *jsr
  85. *addq.l    #6,sp
  86. *
  87. *KEY
  88. *move.l    evetRec_whom1(a5),-(sp)
  89. *pea.l    STRCTptr(a5)
  90. *Move.w    #4,-(sp)
  91. *jsr
  92. *lea.l    10(sp),sp
  93.  
  94. *CHKSELECT
  95. *move.l    now_mpt(a5),-(sp)
  96. *move.l    argc(a5),-(sp)
  97. *pea.l    STRCTptr(a5)
  98. *Move.w    #5,-(sp)
  99. *jsr
  100. *lea.l    14(sp),sp
  101.  
  102.  
  103.  
  104. .text
  105. *-------------------------------------
  106. ScrProc::
  107.     link    a6,#ofs
  108.     movem.l    SCREGS,-(sp)
  109.     moveq    #0,d0
  110.  
  111.     move.l    SCPtr(a6),a4        *スクロールシステム用構造体のアドレス
  112.     move.w    SCmode(a6),d0        *コマンドナンバー
  113.     moveq    #5,d1            *コマンドの上限
  114.     cmp.w    d1,d0
  115.     bhi    Break
  116.     add.l    d0,d0
  117.     move.w    jmptbl(pc,d0.l),d1
  118.     jmp    jmptbl(pc,d1.w)
  119.  
  120.  
  121. jmptbl:
  122.     dc.w    initctrl-jmptbl            *コントロール初期化
  123.     dc.w    drawall-jmptbl            *全部描画するルーチン
  124.     dc.w    SCBarChk-jmptbl            *ボタンが押された時
  125.     dc.w    endctrl-jmptbl            *終了処理    とりあえずなしね
  126.     dc.w    keyCtrl-jmptbl
  127.     dc.w    ChkSlct-jmptbl
  128.     dc.w    Break-jmptbl
  129.     dc.w    Break-jmptbl
  130.     dc.w    Break-jmptbl
  131.  
  132. Break:
  133.     moveq    #0,d0
  134. Break2:
  135.     movem.l    (sp)+,SCREGS
  136.     unlk    a6
  137.     rts
  138. *-------------------------------------
  139. initctrl:
  140.     ifeq    <cmpa.l    #0,a4>            
  141.         move.l    #SCSIZE,-(sp)        *カレントヒープに構造体確保
  142.         SX    __MMChPtrNew,4
  143.         ifeq    <move.l    d0,a4>
  144.             moveq    #-1,d0
  145.             bra    Break2        *できなければエラー
  146.         else
  147.             move.l    a4,a1
  148.             for    d1,<move.l #SCSIZE,d1>
  149.                 move.b    #0,(a1)+
  150.             next
  151.             move.w    #-1,tmpFlg1(a4)
  152.         endif
  153.     endif
  154.  
  155.     move.l    #30,WaitCount(a4)        *デフォルトのウェイトカウント(後で変更可能)
  156.     move.w    SCfont(a6),Sfont(a4)
  157.     move.w    SCx1(a6),x1(a4)
  158.     move.w    SCyy(a6),yy(a4)
  159.     move.w    SCchr(a6),chr(a4)
  160.     move.w    SCchr2(a6),chr2(a4)
  161.     move.w    SCyline(a6),yline(a4)
  162.     move.l    SCwinPtr(a6),cwinPtr(a4)
  163.     move.l    #0,cTTL(a4)            *ダミー
  164.     move.l    SCstrHdl(a6),StrHdl(a4)        *文字列リスト(固定長)へのハンドル
  165.     move.l    SCargc(a6),UsrArgc(a4)        *要素数-1
  166.     move.w    SCfontline(a6),fontline(a4)
  167.     move.w    SCscrline(a6),scrline(a4)
  168.     move.l    SCKeyPtr(a6),KeyPtr(a4)
  169.  
  170. *x2=chr*Sfont/2
  171.     moveq    #0,d0
  172.     move.l    d0,d1
  173.     move.w    Sfont(a4),d0
  174.     lsr.w    #1,d0
  175.     move.w    chr(a4),d1
  176.     mulu    d1,d0
  177.     move.w    d0,x2(a4)
  178. *lim=fontline*yline
  179.     moveq    #0,d0
  180.     move.l    d0,d1
  181.     move.w    fontline(a4),d0
  182.     move.w    yline(a4),d1
  183.     mulu    d1,d0
  184.     move.w    d0,lim(a4)
  185. *cLOC
  186.     move.w    x1(a4),d0
  187.     add.w    x2(a4),d0
  188.     addq.w    #4,d0
  189.     move.w    d0,cLOC(a4)
  190.  
  191.     add.w    #17,d0
  192.     move.w    d0,cLOC+4(a4)
  193.  
  194.     move.w    yy(a4),d0
  195.     subq.w    #4,d0
  196.     move.w    d0,cLOC+2(a4)
  197.     moveq    #0,d0
  198.     move.w    yy(a4),d0
  199.     addq.w    #4,d0
  200.     add.w    lim(a4),d0
  201.     move.w    d0,cLOC+6(a4)
  202.  
  203. *SCRect        x1,yy,x1+x2,lim+yy
  204. *Scr_pt
  205.     move.w    x1(a4),SCRect(a4)
  206.     move.w    yy(a4),SCRect+2(a4)
  207.     moveq    #0,d0
  208.     move.w    x1(a4),d0
  209.     move.w    d0,Scr_pt(a4)
  210.     add.w    x2(a4),d0
  211.     move.w    d0,SCRect+4(a4)
  212.     moveq    #0,d0
  213.     move.w    yy(a4),d0
  214.     move.w    d0,Scr_pt+2(a4)
  215.     add.w    lim(a4),d0
  216.     move.w    d0,SCRect+6(a4)
  217. *limit_pt=lim-fontline
  218.     moveq    #0,d0
  219.     moveq    #0,d1
  220.     move.w    fontline(a4),d1
  221. *    mulu.w    scrline(a4),d1        *ここ
  222.     move.w    lim(a4),d0
  223.     sub.w    d1,d0
  224.     move.w    d0,limit_pt(a4)
  225. *limit_pt2=lim
  226.     move.w    #0,limit_pt2(a4)
  227.     move.w    lim(a4),limit_pt2+2(a4)
  228. *limit_pt3=fontline*scrline
  229.     moveq    #0,d0
  230.     move.w    fontline(a4),d0
  231.     mulu    scrline(a4),d0
  232.     move.l    d0,limit_pt3(a4)
  233. *lim_ofs=(lim/fontline)-1
  234.     move.w    lim(a4),d0
  235.     move.w    fontline(a4),d1
  236.     divu    d1,d0
  237.     subq.w    #1,d0
  238.     move.w    d0,lim_ofs(a4)
  239. *yline1
  240.     move.w    yline(a4),d0
  241.     subq.w    #1,d0
  242.     move.w    d0,yline1(a4)
  243.  
  244.         moveq    #0,d0
  245.         move.l    d0,-(sp)
  246.         move.w    #67*16,-(sp)
  247.         move.w    d0,-(sp)
  248.         move.w    d0,-(sp)
  249.         move.w    d0,-(sp)
  250.         move.w    #TRUE,-(sp)
  251.         pea.l    cTTL(a4)
  252.         pea.l    cLOC(a4)
  253.         move.l    cwinPtr(a4),-(sp)
  254.         SX    __CMOpen,26
  255.         move.l    d0,d0
  256.         move.l    a0,cHDL(a4)
  257.  
  258.         bsr    SetSCBar
  259.  
  260.     move.l    cHDL(a4),d0    *一応コントロールハンドル返す
  261.     move.l    a4,a0        *構造体のアドレス返す
  262.     bra    Break2
  263. *-------------------------------------
  264. SetSCBar:
  265.     movem.l    d1-d3,-(sp)
  266.  
  267.         moveq    #0,d0
  268.         move.l    d0,d2
  269.         move.l    d0,d3
  270.  
  271.         move.l    UsrArgc(a4),d2
  272.         mulu.w    fontline(a4),d2
  273.         move.l    d2,d1            *d2=def
  274.  
  275.     iflt    <sub.w    limit_pt(a4),d1>
  276.         move.w    #0,d3
  277.     else
  278.         move.w    d1,d3        *max
  279.     endif
  280.  
  281.         move.w    SCDisp(a4),d1        *val
  282.  
  283.     ifne    <cmp.w    nowSCmax(a4),d3>    *max
  284.         bra    @f
  285.     elseifne <cmp.w    nowSCval(a4),d1>    *val
  286.         bra    @f
  287.     elseifne <cmp.w    nowSCdef(a4),d2>    *def
  288.         bra    @f
  289.     else
  290.         bra    SSCB_end
  291.     endif
  292. @@:
  293.             move.w    d3,-(sp)
  294.             move.l    cHDL(a4),-(sp)
  295.             SX    __CMMaxSet,6
  296.  
  297.             move.w    d1,-(sp)
  298.             move.l    cHDL(a4),-(sp)
  299.             SX    __CMValueSet,6
  300.  
  301.             move.w    d2,-(sp)
  302.             move.w    #1,-(sp)
  303.             move.l    cHDL(a4),-(sp)
  304.             SX    __CMDefDataSet,8
  305.  
  306.             move.w    d2,nowSCdef(a4)
  307.             move.w    d3,nowSCmax(a4)
  308.             move.w    d1,nowSCval(a4)
  309. SSCB_end:
  310.         movem.l    (sp)+,d1-d3
  311.         rts
  312. *==============================================*
  313. *コマンド2(コントロール操作時の処理)
  314. *==============================================*
  315. SCBarChk:
  316.         move.l    SCnowx(a6),local_xy(a4)
  317.         SX    __EMSysTime,0
  318.         move.l    d0,Timer(a4)        *Timer処理のため現在時間取得
  319.  
  320.         moveq    #0,d3
  321.         move.l    d3,d4
  322.         move.w    SCDisp(a4),d4
  323.         move.w    SCpart(a6),d1
  324. ****サムの処理****
  325.     ifeq <cmpi.w    #C_INTHUMB,d1>            *サムか
  326.         move.l    #0,-(sp)    *pea.l    0.w
  327.         move.l    local_xy(a4),-(sp)
  328.         move.l    cHDL(a4),-(sp)
  329.         SX    __CMCheck,12            *マウスボタンが離されるまで追跡
  330.         move.l    cHDL(a4),-(sp)
  331.         SX    __CMValueGet,4            *スクロールバーの値読みだし
  332.         move.w    d0,d4
  333.         divu.w    fontline(a4),d4            *端数を切る
  334.         mulu.w    fontline(a4),d4            *フォントラインで切る
  335.  
  336.         move.w    d4,-(sp)
  337.         bsr    DoScroll            *スクロール処理
  338.         addq.w    #2,sp
  339. *****アップダウンの処理******
  340.     elseifeq <cmpi.w #C_INUP,d1>            *スクロールアップボタンか?
  341.         moveq    #-1,d3
  342.         move.l    limit_pt3(a4),d0
  343.         bsr    SCBC_subN
  344.     elseifeq <cmpi.w #C_INPGUP,d1>            *ページアップか
  345.         moveq    #-1,d3
  346.         move.l    limit_pt2(a4),d0
  347.         bsr    SCBC_sub
  348.         moveq    #0,d0
  349.     elseifeq <cmpi.w #C_INPGDOWN,d1>
  350.         move.l    limit_pt2(a4),d0        *ページスクロールの増分
  351.         bsr    SCBC_sub
  352.         moveq    #0,d0
  353.     elseifeq <cmpi.w #C_INDOWN,d1>
  354.         move.l    limit_pt3(a4),d0        *1行スクロールの増分
  355.         bsr    SCBC_subN
  356.     endif
  357. SCBC_end2:
  358.         bra    Break2
  359. *==============================================*
  360. *値が最小値最大値を越えないようにして
  361. *スクロール処理させる(do scroll)
  362. *==============================================*
  363. SCBC_sub:
  364.         ifne    <tst.w    d3>
  365.             sub.w    d0,d4        *UP方向
  366.         else
  367.             add.w    d0,d4        *DOWN方向
  368.         endif
  369.  
  370.         iflt    <cmpi.w    #0,d4>
  371.             moveq    #0,d0
  372.             move.w    d0,d4
  373.  
  374.         else
  375.             move.l    cHDL(a4),-(sp)
  376.             SX    __CMMaxGet,4
  377.             iflt    <cmp.w    d4,d0>
  378.             move.w    d0,d4
  379.  
  380.             endif
  381.         endif
  382.  
  383.         move.w    d4,-(sp)
  384.         bsr    DoScroll
  385.         addq.w    #2,sp
  386.  
  387.         rts
  388. *==============================================*
  389. *ボタンの処理
  390. *==============================================*
  391. SCBC_subN:
  392.         ifne    <tst.w    d3>
  393.             sub.w    d0,d4        *UP方向
  394.         else
  395.             add.w    d0,d4        *DOWN方向
  396.         endif
  397.  
  398.         iflt    <tst.w    d4>        *最大最小越えない範囲に補正
  399.             moveq    #0,d0
  400.             rts
  401. *            move.w    d0,d4
  402.         else
  403.             move.l    cHDL(a4),-(sp)
  404.             SX    __CMMaxGet,4
  405.             iflt    <cmp.w    d4,d0>
  406. *            move.w    d0,d4
  407.             rts
  408.             endif
  409.         endif
  410.  
  411.         move.w    d3,-(sp)
  412.         move.w    d4,-(sp)        *(元の値-CTRLVAL現在値
  413.         bsr    DoScrollN
  414.         addq.w    #4,sp
  415.  
  416.         move.l    cHDL(a4),-(sp)
  417.         SX    __CMValueGet,0
  418.         move.w    d0,d1
  419.         SX    __CMMaxGet,4
  420.  
  421.         ifeq    <tst.w    d1>
  422.             rts
  423.         elseifeq <cmp.w    d0,d1>
  424.             rts
  425.         endif
  426.  
  427.         SX    __EMLStill,0
  428.         ifeq    <tst.l    d0>
  429.             rts
  430.         endif
  431. @@:
  432.         bsr    WaitPloc        *最初の1動作はウェイト
  433.         tst.l    d0
  434.         beq    @b
  435.  
  436.         SX    __EMLStill,0
  437.         ifeq    <tst.l    d0>
  438.             rts
  439.         endif
  440.  
  441. @@:
  442.         move.l    limit_pt3(a4),d0
  443.         bsr    ~~A
  444.  
  445.         move.l    cHDL(a4),-(sp)
  446.         SX    __CMValueGet,0
  447.         move.w    d0,d1
  448.         SX    __CMMaxGet,4
  449.  
  450.         ifeq    <tst.w    d1>
  451.             rts
  452.         elseifeq <cmp.w    d0,d1>
  453.             rts
  454.         endif
  455.  
  456.         SX    __EMLStill,0
  457.         ifeq    <tst.l    d0>
  458.             rts
  459.         endif
  460.         bra    @b
  461. *==============================================*
  462. ~~A:
  463.         ifne    <tst.w    d3>
  464.             sub.w    d0,d4        *UP方向
  465.         else
  466.             add.w    d0,d4        *DOWN方向
  467.         endif
  468.  
  469.         iflt    <tst.w    d4>        *最大最小越えない範囲に補正
  470.             moveq    #0,d0
  471.             move.w    d0,d4
  472.         else
  473.             move.l    cHDL(a4),-(sp)
  474.             SX    __CMMaxGet,4
  475.             iflt    <cmp.w    d4,d0>
  476.                 move.w    d0,d4
  477.             endif
  478.         endif
  479.  
  480.         move.w    d3,-(sp)
  481.         move.w    d4,-(sp)
  482.         bsr    DoScrollN
  483.         addq.w    #4,sp
  484.  
  485.         rts
  486. *==============================================*
  487. ofs    =    -16
  488. .offset    ofs
  489. DSNTmpRect:    ds.l    2
  490. DSNTmpRgn:    ds.l    1
  491. DSN1        ds.l    1
  492. ds.l    2
  493. REGD4        ds.w    1
  494. PLUMI        ds.w    1
  495. .text
  496. DoScrollN:
  497.         link    a6,#ofs
  498.         movem.l    d1-d7/a1-a2,-(sp)
  499.         moveq    #0,d0
  500.         move.w    SCDisp(a4),d0
  501.         sub.w    REGD4(a6),d0
  502.         move.l    d0,DSN1(a6)        *DS1=スクロールオフセット
  503.  
  504.         SX    __GMNewRgn,0
  505.         move.l    a0,DSNTmpRgn(a6)    *スクロールの際戻ってくるリージョンを確保
  506.  
  507.         move.l    DSNTmpRgn(a6),-(sp)
  508.         move.l    DSN1(a6),-(sp)
  509.         pea.l    SCRect(a4)
  510.         SX    __GMScroll,12        *スクロール
  511.  
  512.         movea.l    cwinPtr(a4),a0
  513.         adda.l    #$50,a0
  514.         move.l    DSN1(a6),-(sp)
  515.         move.l    (a0),-(sp)
  516.         SX    __GMSlideRgn,8        *アップデートリージョンを操作
  517.  
  518.     ifeq    <tst.w    PLUMI(a6)>        *スクロール方向のフラグチェック
  519.         move.l    SCRect(a4),d3
  520.         add.w    limit_pt(a4),d3
  521.         add.w    fontline(a4),d3
  522.         move.w    fontline(a4),d4
  523.         mulu    scrline(a4),d4        *
  524.         sub.w    d4,d3
  525.         move.l    d3,DSNTmpRect(a6)
  526.  
  527.         move.w    fontline(a4),d4
  528.         mulu    scrline(a4),d4        *
  529.         add.w    d4,d3
  530.         swap    d3
  531.         add.w    x2(a4),d3
  532.         swap    d3
  533.         move.l    d3,DSNTmpRect+4(a6)
  534.  
  535.     else
  536.         move.l    SCRect(a4),d3
  537.         move.l    d3,DSNTmpRect(a6)
  538.  
  539.         move.w    fontline(a4),d4
  540.         mulu    scrline(a4),d4        *
  541.         add.w    d4,d3
  542.         swap    d3
  543.         add.w    x2(a4),d3
  544.         swap    d3
  545.         move.l    d3,DSNTmpRect+4(a6)
  546.     endif
  547.  
  548.  
  549.         pea.l    DSNTmpRect(a6)
  550.         move.l    DSNTmpRgn(a6),-(sp)
  551.         move.l    DSNTmpRgn(a6),-(sp)    *直書きする文字のところの
  552.         SX    __GMXorRectRgn,12    *リージョンをUPDATE用貯蔵分から削る
  553.  
  554.         move.l    #$0,-(sp)
  555.         SX    __GMLocalToGlobal,4
  556.  
  557.         move.l    d0,-(sp)
  558.         move.l    DSNTmpRgn(a6),-(sp)
  559.         SX    __GMSlideRgn,8        UPDATE すべきREGIONをグローバル座標に直す
  560.  
  561.         move.l    DSNTmpRgn(a6),-(sp)
  562.         SX    __WMAddRgn,4            *アップデートリージョンに追加
  563.  
  564.         move.l    DSNTmpRgn(a6),-(sp)
  565.         SX    __GMDisposeRgn,4    *テンポラリ用のリージョンを捨てる
  566.  
  567.  
  568.         move.w    8(a6),SCDisp(a4)
  569.  
  570.         bsr    SetSCBar        *コントロールの値を更新する
  571.  
  572.         move.l    cHDL(a4),-(sp)
  573.         SX    __CMValueGet,4            *スクロールバーの値取得
  574.         move.l    d0,d1
  575.  
  576.         divu.w    fontline(a4),d1
  577.         moveq    #0,d6
  578.         move.w    d1,d6                ***
  579.         mulu    chr2(a4),d1        *加工
  580.  
  581.         move.l    StrHdl(a4),-(sp)
  582.         SX    __MMHdlLock,4
  583.  
  584.     ifeq    <tst.w    PLUMI(a6)>        *下の段
  585.         moveq    #0,d7
  586.         move.w    yline(a4),d7
  587.         subq.w    #1,d7
  588.         add.w    d7,d6                ***
  589.         mulu    chr2(a4),d7
  590.  
  591.         move.l    SCRect(a4),d3        *X
  592.         add.w    limit_pt(a4),d3        *Y
  593.         move.l    d3,-(sp)
  594.         SX    __GMMove,4
  595.  
  596.             move.l    StrHdl(a4),a1        *NameList=画像項目のリスト(HDL)
  597.             move.l    (a1),a1            *先頭
  598.             adda.l    d1,a1
  599.             adda.l    d7,a1
  600.  
  601.         move.w    scrline(a4),d2
  602.         subq.w    #1,d2
  603.  
  604.         for    d2,<>
  605.             ifne    <tst.w    tmpFlg4(a4)>
  606.                 ifne    <cmp.w    tmpFlg2(a4),d6>
  607.                     move.w    #G_BLACK,-(sp)
  608.                     SX    __GMForeColor,2
  609.                     move.w    #G_LGRAY,-(sp)
  610.                     SX    __GMBackColor,2
  611.                 else
  612.                     move.w    #G_LGRAY,-(sp)
  613.                     SX    __GMForeColor,2
  614.                     move.w    #G_BLACK,-(sp)
  615.                     SX    __GMBackColor,2
  616.                 endif
  617.             endif
  618.             pea.l    (a1)
  619.             SX    __GMDrawStrZ,4        *FILENAME表示
  620.  
  621.             sub.w    fontline(a4),d3    *Y
  622.             move.l    d3,-(sp)
  623.             SX    __GMMove,4
  624.  
  625.             suba.w    chr2(a4),a1
  626.             subq.l    #1,d6
  627.         next
  628.         move.w    #G_BLACK,-(sp)
  629.         SX    __GMForeColor,2
  630.         move.w    #G_LGRAY,-(sp)
  631.         SX    __GMBackColor,2
  632.     else                    *上の段
  633.         move.l    Scr_pt(a4),d3
  634.         move.l    d3,-(sp)
  635.         SX    __GMMove,4
  636.  
  637.         move.w    scrline(a4),d2
  638.         subq.w    #1,d2
  639.  
  640.         move.l    StrHdl(a4),a1        *NameList
  641.         move.l    (a1),a1            *先頭
  642.         adda.l    d1,a1
  643.  
  644.         for    d2,<>
  645.             ifne    <tst.w    tmpFlg4(a4)>
  646.                 ifne    <cmp.w    tmpFlg2(a4),d6>
  647.                     move.w    #G_BLACK,-(sp)
  648.                     SX    __GMForeColor,2
  649.                     move.w    #G_LGRAY,-(sp)
  650.                     SX    __GMBackColor,2
  651.                 else
  652.                     move.w    #G_LGRAY,-(sp)
  653.                     SX    __GMForeColor,2
  654.                     move.w    #G_BLACK,-(sp)
  655.                     SX    __GMBackColor,2
  656.                 endif
  657.             endif
  658.             pea.l    (a1)
  659.             SX    __GMDrawStrZ,4        *FILENAME表示
  660.  
  661.             add.w    fontline(a4),d3    *Y
  662.             move.l    d3,-(sp)
  663.             SX    __GMMove,4
  664.  
  665.             adda.w    chr2(a4),a1
  666.             addq.l    #1,d6
  667.         next
  668.  
  669.         move.w    #G_BLACK,-(sp)
  670.         SX    __GMForeColor,2
  671.         move.w    #G_LGRAY,-(sp)
  672.         SX    __GMBackColor,2
  673.  
  674.     endif
  675.  
  676.         move.l    StrHdl(a4),-(sp)
  677.         SX    __MMHdlUnlock,4
  678.  
  679.         movem.l    (sp)+,d1-d7/a1-a2
  680.         unlk    a6
  681.         rts
  682.  
  683. DSN_err:
  684.         movem.l    (sp)+,d1-d7/a1-a2
  685.         unlk    a6
  686.         ~F
  687.         rts
  688. *==============================================*
  689.  
  690.  
  691. *==============================================*
  692. ofs    =    -28
  693. .offset    ofs
  694. DSTmpRgn:    ds.l    1
  695. DSupdRgn:    ds.l    1
  696. DStmpRect:    ds.w    4
  697. DStmp2Rect:    ds.w    4
  698. DS1:        ds.l    1
  699. ds.l    2
  700. .text
  701. DoScroll:
  702.         link    a6,#ofs
  703.         moveq    #0,d0
  704.         move.w    SCDisp(a4),d0
  705.         sub.w    8(a6),d0
  706.         move.l    d0,DS1(a6)        *DS1=スクロールオフセット
  707.  
  708.         move.l    SCRect(a4),DStmp2Rect(a6)
  709.         move.l    SCRect+4(a4),DStmp2Rect+4(a6)
  710.  
  711.         move.l    d0,-(sp)
  712.         pea.l    DStmp2Rect(a6)
  713.         SX    __GMSlideRect,8        *レクタングルをずらす
  714.  
  715.         pea.l    DStmp2Rect(a6)
  716.         pea.l    SCRect(a4)
  717.         pea.l    DStmpRect(a6)        *テンポラリ
  718.         SX    __GMAndRect,12        *重なる部分があるかチェック
  719.  
  720.     ifne    <move.l    d0,d0>            *重なる部分があった時の処理
  721.         SX    __GMNewRgn,0
  722.         move.l    a0,DSTmpRgn(a6)
  723.  
  724.         move.l    DSTmpRgn(a6),-(sp)
  725.         move.l    DS1(a6),-(sp)
  726.         pea.l    SCRect(a4)
  727.         SX    __GMScroll,12        *スクロール
  728.  
  729.         move.l    #$0,-(sp)
  730.         SX    __GMLocalToGlobal,4
  731.  
  732.         move.l    d0,-(sp)
  733.         move.l    DSTmpRgn(a6),-(sp)
  734.         SX    __GMSlideRgn,8        *アップデートリージョンをグローバル座標に直す
  735.  
  736.         move.l    DSTmpRgn(a6),-(sp)
  737.         SX    __WMAddRgn,4            *アップデートリージョンに追加
  738.  
  739.         move.l    DSTmpRgn(a6),-(sp)
  740.         SX    __GMDisposeRgn,4
  741.     else                        *重なる部分がない時の処理
  742.  
  743.         move.l    SCRect(a4),DStmp2Rect(a6)
  744.         move.l    SCRect+4(a4),DStmp2Rect+4(a6)
  745.  
  746.         move.l    #$0,-(sp)
  747.         SX    __GMLocalToGlobal,4
  748.  
  749.         move.l    d0,-(sp)
  750.         pea.l    DStmp2Rect(a6)
  751.         SX    __GMSlideRect,8
  752.  
  753.         pea.l    DStmp2Rect(a6)
  754.         SX    __WMAddRect,4            *アップデートに任せる
  755.     endif
  756.  
  757.         move.w    8(a6),SCDisp(a4)
  758.  
  759.         bsr    SetSCBar            *コントロールの値を更新する
  760.  
  761.         unlk    a6
  762.         rts
  763. *==============================================*
  764. drawall:
  765.     move.l    SCstrHdl(a6),StrHdl(a4)        *文字列リスト(固定長)へのハンドル
  766.     move.l    SCargc(a6),UsrArgc(a4)        *要素数-1
  767.  
  768.     bsr    drawproc
  769.     bra    Break
  770.  
  771. *xdef    drawploc
  772. drawproc:
  773.     movem.l    d1-d5/a1,-(sp)
  774.  
  775.     SETPORT2 cwinPtr(a4)
  776.  
  777.     move.w    #G_BLACK,-(sp)
  778.     SX    __GMForeColor,2
  779.     move.w    #G_LGRAY,-(sp)
  780.     SX    __GMBackColor,2
  781.  
  782.     move.w    #$100,-(sp)
  783.     SX    __GMPenMode,2
  784.     move.w    d0,-(sp)
  785.     pea.l    SCRect(a4)
  786.     SX    __GMFillRect,4
  787.     SX    __GMPenMode,2
  788.  
  789.     move.l    cHDL(a4),-(sp)
  790.     SX    __CMValueGet,4            *スクロールバーの値取得
  791.     move.l    d0,d1
  792.  
  793.     divu.w    fontline(a4),d1        *1行増分で割るどのポイントから描くか
  794.     move.w    d1,d5
  795.     mulu    chr2(a4),d1        *加工(参照するメモリの固まりが1FILEで54BYTE)
  796.  
  797.     move.l    Scr_pt(a4),d3        *スクロール開始の左上座標
  798.     move.l    d3,-(sp)
  799.     SX    __GMMove,4
  800.  
  801.     move.l    StrHdl(a4),-(sp)
  802.     SX    __MMHdlLock,4
  803.  
  804.     move.l    StrHdl(a4),a1        *NameList=画像項目のリスト(HDL)
  805.     move.l    (a1),a1            *先頭
  806.     adda.w    d1,a1
  807.  
  808.     move.l UsrArgc(a4),d2        *UsrArgc=FILE数-1
  809.     cmp.l    #-1,d2
  810.     beq    @f
  811.     ifcc    <cmp.w    yline1(a4),d2>        *yline1=Y方向の表示可能最大数-1
  812.         move.w    yline1(a4),d2
  813.     endif
  814.  
  815.     moveq.l    #0,d4
  816.     move.w    d5,d4
  817.     for    d2,<>
  818.  
  819.     ifne    <tst.w    tmpFlg4(a4)>
  820.         ifne    <cmp.w    tmpFlg2(a4),d4>
  821.             move.w    #G_BLACK,-(sp)
  822.             SX    __GMForeColor,2
  823.             move.w    #G_LGRAY,-(sp)
  824.             SX    __GMBackColor,2
  825.         else
  826.             move.w    #G_LGRAY,-(sp)
  827.             SX    __GMForeColor,2
  828.             move.w    #G_BLACK,-(sp)
  829.             SX    __GMBackColor,2
  830.         endif
  831.     endif
  832.         pea.l    (a1)
  833.         SX    __GMDrawStrZ,4        *FILENAME表示
  834.  
  835.  
  836.         add.w    fontline(a4),d3
  837.  
  838.         move.l    d3,-(sp)
  839.         SX    __GMMove,4
  840.         adda.w    chr2(a4),a1            *次の項目の先頭
  841.         addq.l    #1,d4
  842.     next
  843.     move.w    #G_BLACK,-(sp)
  844.     SX    __GMForeColor,2
  845.     move.w    #G_LGRAY,-(sp)
  846.     SX    __GMBackColor,2
  847.  
  848.  
  849.  
  850. @@:
  851.     move.l    StrHdl(a4),-(sp)
  852.     SX    __MMHdlUnlock,4
  853.  
  854.     bsr    SetSCBar
  855.  
  856.     movem.l    (sp)+,d1-d5/a1
  857.     rts
  858. *==============================================*
  859. *スクロールバー廃棄
  860. *==============================================*
  861. endctrl:
  862.     move.l    cHDL(a4),-(sp)
  863.     SX    __CMDispose,4
  864.  
  865.     ifne    <tst.w    tmpFlg1(a4)>
  866.         pea.l    (a4)
  867.         SX    __MMPtrDispose,4
  868.     endif
  869.  
  870.     bra    Break
  871. *===============================================*
  872. *ウェイトをいれるための関数
  873. *===============================================*
  874. WaitPloc:
  875.     move.l    d1,-(sp)
  876.  
  877.     SX    __EMSysTime,0            *システム時間の取得
  878.  
  879.         move.l    d0,d1
  880.         sub.l    Timer(a4),d0    *カウントダウンして、時間きたかをd0に返す
  881.  
  882.     ifcs    <cmp.l    WaitCount(a4),d0>            *リピート間隔
  883.         moveq    #0,d0            *まだ時間きてない
  884.         move.l    (sp)+,d1
  885.         rts
  886.     else
  887.         move.l    d1,Timer(a4)
  888.         moveq    #-1,d0            *きちゃった
  889.         move.l    (sp)+,d1
  890.         rts
  891.     endif
  892. *===============================================*
  893. KCREGS    reg    d1-d3/a1
  894.  
  895. keyCtrl:
  896.     movem.l    KCREGS,-(sp)
  897.     ifeq    <tst.l    KeyPtr(a4)>        *キーの定義がない時
  898.         movem.l    (sp)+,KCREGS
  899.         bra    Break
  900.     else
  901.         move.l    KeyPtr(a4),a1
  902.         move.w    SCDisp(a4),d2
  903.         move.l    SCKey(a6),d3
  904.  
  905.         ifeq    <cmp.l    (a1),d3>
  906.             moveq    #0,d1
  907.             move.l    limit_pt3(a4),d0        *1行スクロールUPの増分
  908.             bsr    KCsub1
  909.             movem.l    (sp)+,KCREGS
  910.             bra    Break
  911.  
  912.         elseifeq <cmp.l    4(a1),d3>
  913.             moveq    #-1,d1
  914.             move.l    limit_pt3(a4),d0        *1行スクロールDOWNの増分
  915.             bsr    KCsub1
  916.             movem.l    (sp)+,KCREGS
  917.             bra    Break
  918.  
  919.         elseifeq <cmp.l    8(a1),d3>
  920.             moveq    #0,d1
  921.             move.l    limit_pt2(a4),d0        *ページスクロールUP
  922.             bsr    KCsub2
  923.             movem.l    (sp)+,KCREGS
  924.             bra    Break
  925.  
  926.         elseifeq <cmp.l    12(a1),d3>
  927.             moveq    #-1,d1
  928.             move.l    limit_pt2(a4),d0        *ページスクロールDOWN
  929.             bsr    KCsub2
  930.             movem.l    (sp)+,KCREGS
  931.             bra    Break
  932.  
  933.         else
  934.  
  935.             movem.l    (sp)+,KCREGS
  936.             bra    Break
  937.         endif
  938.     endif
  939.  
  940. KCsub1:
  941.         ifne    <tst.w    d1>
  942.             sub.w    d0,d2        *UP方向
  943.         else
  944.             add.w    d0,d2        *DOWN方向
  945.         endif
  946.  
  947.         iflt    <tst.w    d2>        *最大最小越えない範囲に補正
  948.             moveq    #0,d0
  949.             moveq    #0,d2
  950.             rts
  951.         else
  952.             move.l    cHDL(a4),-(sp)
  953.             SX    __CMMaxGet,4
  954.             iflt    <cmp.w    d2,d0>
  955.                 rts
  956.             endif
  957.         endif
  958.  
  959.         move.w    d1,-(sp)
  960.         move.w    d2,-(sp)        *(元の値-CTRLVAL現在値
  961.         bsr    DoScrollN
  962.         addq.w    #4,sp
  963.         rts
  964.  
  965. KCsub2:
  966.         ifne    <tst.w    d1>
  967.             sub.w    d0,d2        *UP方向
  968.         else
  969.             add.w    d0,d2        *DOWN方向
  970.         endif
  971.  
  972.         iflt    <tst.w    d2>        *最大最小越えない範囲に補正
  973.             moveq    #0,d0
  974.             moveq    #0,d2
  975. *            rts
  976.         else
  977.             move.l    cHDL(a4),-(sp)
  978.             SX    __CMMaxGet,4
  979.             iflt    <cmp.w    d2,d0>
  980. *                rts
  981.                 move.w    d0,d2
  982.             endif
  983.         endif
  984.  
  985.         move.w    d1,-(sp)
  986.         move.w    d2,-(sp)        *(元の値-CTRLVAL現在値
  987.         bsr    DoScroll
  988.         addq.w    #4,sp
  989.         rts
  990. *===============================================*
  991. ChkSlct:        *a4=SCptr
  992.             *SCslct(a6).l=now_mpt
  993.     move.l    SCargc(a6),UsrArgc(a4)        *要素数-1
  994.  
  995.     move.l    SCslct(a6),-(sp)
  996.     pea.l    SCRect(a4)
  997.     SX    __GMPtInRect,8        *名前の枠の中でクリックされたか
  998.  
  999.     ifne    <move.l    d0,d0>        *ならば
  1000.         move.w    SCslct+2(a6),d1    *mspos_y
  1001.         sub.w    yy(a4),d1    *
  1002.         divu.w    fontline(a4),d1    *これで、表示中のうち何番目かを知る
  1003.  
  1004.         move.l    cHDL(a4),-(sp)
  1005.         SX    __CMValueGet,4
  1006.         divu.w    fontline(a4),d0
  1007.         add.w    d1,d0            *これで何番目かわかる
  1008.         move.l    d0,d7
  1009.  
  1010.         cmp.w    SCargc+2(a6),d0
  1011.         bhi    CSt_end1
  1012.  
  1013.         move.w    tmpFlg2(a4),tmpFlg3(a4)    *前のやつ
  1014.         move.w    d0,tmpFlg2(a4)
  1015.         ifne    <cmp.w    tmpFlg3(a4),d0>
  1016.             bsr    drawproc2
  1017.             move.w    #-1,tmpFlg4(a4)
  1018.         elseifeq <tst.w tmpFlg4(a4)>
  1019.             bsr    drawproc2
  1020.             move.w    #-1,tmpFlg4(a4)
  1021.         endif
  1022.         move.l    d7,d0            *何番目かを返す
  1023.         swap    d0
  1024.         move.w    d1,d0            *表示中の位置も返す
  1025.         swap    d0
  1026. CSt_end:
  1027.     bra    Break2
  1028.     endif
  1029. CSt_end1:
  1030.     ~F
  1031.     bra    Break2
  1032. *===============================================*
  1033. drawproc2:
  1034.     link    a6,#-8
  1035.     movem.l    d1-d6/a1,-(sp)
  1036.  
  1037.     move.l    d0,d2            *d0=LIST番号
  1038.     mulu    chr2(a4),d2        *d1=LIST先頭からのオフセット
  1039.  
  1040. *    move.w    #G_FORE*$100+G_PSET,-(sp)
  1041. *    SX    __GMPenMode,2
  1042.  
  1043.     SETPORT2 cwinPtr(a4)
  1044.     move.l    StrHdl(a4),-(sp)
  1045.     SX    __MMHdlLock,4
  1046.  
  1047.     moveq    #0,d4
  1048.     move.w    tmpFlg3(a4),d4        *d4=LIST番号
  1049.  
  1050.     move.l    cHDL(a4),-(sp)
  1051.     SX    __CMValueGet,4            *スクロールバーの値取得
  1052.     move.l    d0,d5
  1053.     divu.w    fontline(a4),d5        *1行増分で割るどのポイントから描くか
  1054.     move.w    d5,d6
  1055.  
  1056.     ifhi    <cmp.w    d4,d5>
  1057.         bra    @f
  1058.     endif
  1059.     add.w    yline1(a4),d6
  1060.     ifhi    <cmp.w    d6,d4>
  1061.         bra    @f
  1062.     endif
  1063.  
  1064.     sub.w    d5,d4            *PT
  1065.     moveq    #0,d6
  1066.     move.w    tmpFlg3(a4),d6
  1067.     mulu    chr2(a4),d6        *offset
  1068.  
  1069.     move.w    #G_BLACK,-(sp)
  1070.     SX    __GMForeColor,2
  1071.     move.w    #G_LGRAY,-(sp)
  1072.     SX    __GMBackColor,2
  1073.  
  1074.     move.l    Scr_pt(a4),d3        *スクロール開始の左上座標
  1075.     mulu.w    fontline(a4),d4
  1076.     add.w    d4,d3
  1077.     move.l    d3,-(sp)
  1078.     SX    __GMMove,4
  1079.  
  1080.     move.l    d3,-8(a6)
  1081.     add.w    fontline(a4),d3
  1082.     swap    d3
  1083.     add.w    x2(a4),d3
  1084.     swap    d3
  1085.     move.l    d3,-4(a6)
  1086.  
  1087.     move.w    #G_BACK*$100+G_PSET,-(sp)
  1088.     SX    __GMPenMode,2
  1089.  
  1090.     pea.l    -8(a6)
  1091.     SX    __GMFillRect,4
  1092.  
  1093.     move.l    StrHdl(a4),a1        *NameList=リスト(HDL:疑似可)
  1094.     move.l    (a1),a1            *先頭
  1095.     adda.w    d6,a1
  1096.     pea.l    (a1)
  1097.     SX    __GMDrawStrZ,4        *FILENAME表示
  1098.  
  1099. @@:
  1100.     move.w    #G_LGRAY,-(sp)
  1101.     SX    __GMForeColor,2
  1102.     move.w    #G_BLACK,-(sp)
  1103.     SX    __GMBackColor,2
  1104.  
  1105.     move.l    Scr_pt(a4),d3        *スクロール開始の左上座標
  1106.     mulu.w    fontline(a4),d1
  1107.     add.w    d1,d3
  1108.     move.l    d3,-(sp)
  1109.     SX    __GMMove,4
  1110.  
  1111.     move.l    d3,-8(a6)
  1112.     add.w    fontline(a4),d3
  1113.     swap    d3
  1114.     add.w    x2(a4),d3
  1115.     swap    d3
  1116.     move.l    d3,-4(a6)
  1117.  
  1118.     move.w    #G_FORE*$100+G_PSET,-(sp)
  1119.     SX    __GMPenMode,2
  1120.  
  1121.     pea.l    -8(a6)
  1122.     SX    __GMFillRect,4
  1123.  
  1124.     move.l    StrHdl(a4),a1        *NameList=リスト(HDL:疑似可)
  1125.     move.l    (a1),a1            *先頭
  1126.     adda.w    d2,a1
  1127.     pea.l    (a1)
  1128.     SX    __GMDrawStrZ,4        *FILENAME表示
  1129.  
  1130.     move.w    #G_BLACK,-(sp)
  1131.     SX    __GMForeColor,2
  1132.     move.w    #G_LGRAY,-(sp)
  1133.     SX    __GMBackColor,2
  1134.  
  1135.  
  1136.     move.l    StrHdl(a4),-(sp)
  1137.     SX    __MMHdlUnlock,4
  1138.  
  1139.     bsr    SetSCBar
  1140.  
  1141.     movem.l    (sp)+,d1-d6/a1
  1142.     unlk    a6
  1143.     rts
  1144.